package ar.edu.caece.pl.asem.model.impl.treeelements;

import ar.edu.caece.pl.asem.temp.TemporalGenerator;

public class SumaInt extends AbstractElement {

	private int tempResultSumaInt; // propio para producto de enteros, se usa
									// para guardar el resultado de un producto
									// temporal.

	public SumaInt() {
		this.label = "SUMA_ENTERO";
	}

	public int getTemp() {
		return tempResultSumaInt;
	}

	public void setTemp(int tempResultSumaInt) {
		this.tempResultSumaInt = tempResultSumaInt;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof SumaInt))
			return false;
		SumaInt other = (SumaInt) obj;
		if (label == null) {
			if (other.label != null)
				return false;
		} else if (!label.equals(other.label))
			return false;
		return true;
	}

	@Override
	public void generateASMCode() {
		StringBuffer sb = new StringBuffer();

		/*
		 * Genera el 2do temporal que lo obtiene del <EXPRESSION1> siempre y
		 * cuando haya una operacion de SUMA o de RESTA.
		 */
		AbstractElement firstTermElement = this.getChildren().get(0);
		AbstractElement seccondTermElement = this.getChildren().get(1);
		firstTermElement.parent = this;
		firstTermElement.generateASMCode();
		this.place = TemporalGenerator.getInstance().getActualTemporal();
		seccondTermElement.parent = this;
		seccondTermElement.generateASMCode();
		sb.append(firstTermElement.code);
		sb.append(seccondTermElement.code);
		
		sb.append(getSum(this.place, TemporalGenerator.getInstance()
				.getActualM1Temporal(), TemporalGenerator.getInstance()
				.getActualTemporal()));
		/*
		 * El resultado de la operacion de SUMA o RESTA lo guarda en uno de esos
		 * 2 temporales, en el de indice menor, luego para optimizar, libera el
		 * temporal de indice mayor ya que en caso de haber otra operacion de +
		 * o - se lo va a volver a usar. De esta forma en cualquier tipo de
		 * operacion de multiplicaciones divisiones sumas y restas se usan 2
		 * temporales.
		 */
		TemporalGenerator.getInstance().releaseTemporal();
		this.code = sb.toString();
	}

	private String getSum(String tmp, String op1, String op2) {
		StringBuffer sb = new StringBuffer();
		sb.append(TAB + "mov ax, " + op1 + ENTER);
		sb.append(TAB + "add ax, " + op2 + ENTER);
		sb.append(TAB + "mov " + tmp + ",ax" + ENTER);
		return sb.toString();
	}

}
